package com.atguigu.demo.mapper;

import com.atguigu.demo.entity.Tiger;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

// @Mapper 注解的作用：把 Mapper 接口实现类的对象放入 IoC 容器中
// 这个实现类并不需要我们创建和编写，而是由 Mybatis 基于动态代理技术，在程序运行时生成的代理类
@Mapper
public interface TigerMapper {

    // int 类型返回值：受影响的行数 （增删改方法的返回值都是受影响的行数）
    int insertTiger(Tiger tiger);

    // int 类型返回值：受影响的行数
    int deleteTigerById(Integer tigerId);

    // int 类型返回值：受影响的行数
    int updateTigerById(Tiger tiger);

    Tiger selectTigerById(Integer tigerId);

    List<Tiger> selectTigerList();

// ${} 在mybatis底层的操作是拼接字符串。 检测该功能的作用
    //创建抽象方法， 映入 表名 tableName
    void testDollar(String tableName);

    //检测 数据输入：零散的简单类型数据
    //使用  @Param(" ")注解
    void updateTiger(Integer tigerId, @Param("tigerName") String tigerName2, int tigerAge, double tigerSalary);

    //检测 数据输入：Map类型参数
    void updateTigerByMap(Map<String, Object> paramsMap);

    //测试数据输出：返回单个简单类型数据
    int selectTigerCount();

    double selectMaxSalary();

    //测试数据输出：返回Map类型
    Map<String, Object> selectTigerInfoMaxSalary();
    //测试数据输出：返回List类型
    List<Map<String, Object>> selectTigerInfoMaxSalary1();

    //测试数据输出：返回自增主键
    /*
    1.  返回自增主键 实际是将自增主键 给设置到 实体类对象中
    即 返回自增主键不是以返回值的形式，即 不是返回值。故而不用方法返回值来接收。
    所以 接口抽象方法 返回值类型 为void。
    2.  形参 传入实体类对象
     */
    void insertTigerWithAutoKey(Tiger tiger);

    //测试 resultMap的使用
    Tiger selectTigerUseRM(Integer tigerId);
}
